package com.ftg.learn.framework.spring.chapter04.container;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author 布衣
 */
public class MyContainer {

    //容器相关  类的唯一  ： 内存地址  :  类地址
    private Map<Class,Object> knowMap= new ConcurrentHashMap<>();

    /**
     * 注册bean
     * @param bean  类信息
     * @param <T>   类泛型
     */
    public <T> void registerBean(Class<T> bean){
        try {
            this.knowMap.put(bean,bean.newInstance());
        } catch (InstantiationException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 注册多个bean
     * @param beans  类信息
     */
    public void registerBean(String[] beans){
        for (String bean : beans) {
            try {
                this.knowMap.put( Class.forName(bean), Class.forName(bean).newInstance());
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
                throw new RuntimeException(e);
            }
        }
    }

    /**
     * 获取bean
     * @param bean  类信息
     */
    public <T> T getBean(Class<T> bean){
        return (T)this.knowMap.get(bean);
    }



    public  static void main(String[] args) {
        //springioc : 管理类的生命周期以及类与类之间的关系
        MyContainer container = new MyContainer();
        //java开发模式
        container.registerBean(Dog.class);

        //xml 开发模式  读取java - xml [dom4j jdom ]


        Dog bean = container.getBean(Dog.class);
        bean.setName("张三丰");
        System.out.println(bean.getName());
//        线程安全处理方案： 加锁        synchronized（同步锁 {类锁| 锁块(锁变量) }）  Lock
//                        无锁化开发   CAS  compare and swap   ConcurrentHashMap
//        Hashtable synchronized 安全的 慢了
        // 类锁 ： 当前实例下面的所有线程
//        public synchronized void clear() {
//            Hashtable.Entry<?,?> tab[] = table;
//            modCount++;
//            for (int index = tab.length; --index >= 0; )
//                tab[index] = null;
//            count = 0;
//        }
//        HashMap : 不安全的 速度快
    }
//
//    final Object o1 =new Object();
//    final Object o2 =new Object();
//    Lock l1 = new ReentrantLock();
//
//    public int abc(){
//        try{
//            l1.lock();
//            return 1;
//        }finally {
//            l1.unlock();
//        }
//    }
//
//    public int def(){
//        synchronized(o2){
//            return 1;
//        }
//    }

}
